home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
usenet
/
sources
/
volume2
/
aplictns
/
matlab
/
src.4
< prev
next >
Wrap
Internet Message Format
|
1988-11-02
|
49KB
Path: xanth!nic.MR.NET!hal!cwjcc!mailrus!ulowell!page
From: page@swan.ulowell.edu (Bob Page)
Newsgroups: comp.sources.amiga
Subject: v02i044: matlab - matrix laboratory, Part04/11
Message-ID: <10019@swan.ulowell.edu>
Date: 2 Nov 88 21:43:07 GMT
Organization: University of Lowell, Computer Science Dept.
Lines: 1220
Approved: page@swan.ulowell.edu
Submitted-by: strovink%galaxy-43@afit-ab.arpa (Mark A. Strovink)
Posting-number: Volume 2, Issue 44
Archive-name: applications/matlab/src.4
# This is a shell archive.
# Remove everything above and including the cut line.
# Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# src-4
# This archive created: Wed Nov 2 16:20:28 1988
cat << \SHAR_EOF > src-4
IF (OP .GT. DOT) GO TO 70
C
C ADDITION
01 IF (M .LT. 0) GO TO 50
IF (M2 .LT. 0) GO TO 52
IF (M .NE. M2) CALL ERROR(8)
IF (ERR .GT. 0) RETURN
IF (N .NE. N2) CALL ERROR(8)
IF (ERR .GT. 0) RETURN
CALL WAXPY(M*N,1.0D0,0.0D0,STKR(L2),STKI(L2),1,
$ STKR(L),STKI(L),1)
GO TO 99
C
C SUBTRACTION
03 IF (M .LT. 0) GO TO 54
IF (M2 .LT. 0) GO TO 56
IF (M .NE. M2) CALL ERROR(9)
IF (ERR .GT. 0) RETURN
IF (N .NE. N2) CALL ERROR(9)
IF (ERR .GT. 0) RETURN
CALL WAXPY(M*N,-1.0D0,0.0D0,STKR(L2),STKI(L2),1,
$ STKR(L),STKI(L),1)
GO TO 99
C
C MULTIPLICATION
05 IF (M2*M2*N2 .EQ. 1) GO TO 10
IF (M*N .EQ. 1) GO TO 11
IF (M2*N2 .EQ. 1) GO TO 10
IF (N .NE. M2) CALL ERROR(10)
IF (ERR .GT. 0) RETURN
MN = M*N2
LL = L + MN
ERR = LL+M*N+M2*N2 - LSTK(BOT)
IF (ERR .GT. 0) CALL ERROR(17)
IF (ERR .GT. 0) RETURN
CALL WCOPY(M*N+M2*N2,STKR(L),STKI(L),-1,STKR(LL),STKI(LL),-1)
DO 08 J = 1, N2
DO 08 I = 1, M
K1 = L + MN + (I-1)
K2 = L2 + MN + (J-1)*M2
K = L + (I-1) + (J-1)*M
STKR(K) = WDOTUR(N,STKR(K1),STKI(K1),M,STKR(K2),STKI(K2),1)
STKI(K) = WDOTUI(N,STKR(K1),STKI(K1),M,STKR(K2),STKI(K2),1)
08 CONTINUE
NSTK(TOP) = N2
GO TO 99
C
C MULTIPLICATION BY SCALAR
10 SR = STKR(L2)
SI = STKI(L2)
L1 = L
GO TO 13
11 SR = STKR(L)
SI = STKI(L)
L1 = L+1
MSTK(TOP) = M2
NSTK(TOP) = N2
13 MN = MSTK(TOP)*NSTK(TOP)
CALL WSCAL(MN,SR,SI,STKR(L1),STKI(L1),1)
IF (L1.NE.L)
$ CALL WCOPY(MN,STKR(L1),STKI(L1),1,STKR(L),STKI(L),1)
GO TO 99
C
C RIGHT DIVISION
20 IF (M2*N2 .EQ. 1) GO TO 21
IF (M2 .EQ. N2) FUN = 1
IF (M2 .NE. N2) FUN = 4
FIN = -1
RHS = 2
GO TO 99
21 SR = STKR(L2)
SI = STKI(L2)
MN = M*N
DO 22 I = 1, MN
LL = L+I-1
CALL WDIV(STKR(LL),STKI(LL),SR,SI,STKR(LL),STKI(LL))
IF (ERR .GT. 0) RETURN
22 CONTINUE
GO TO 99
C
C LEFT DIVISION
25 IF (M*N .EQ. 1) GO TO 26
IF (M .EQ. N) FUN = 1
IF (M .NE. N) FUN = 4
FIN = -2
RHS = 2
GO TO 99
26 SR = STKR(L)
SI = STKI(L)
MSTK(TOP) = M2
NSTK(TOP) = N2
MN = M2*N2
DO 27 I = 1, MN
LL = L+I-1
CALL WDIV(STKR(LL+1),STKI(LL+1),SR,SI,STKR(LL),STKI(LL))
IF (ERR .GT. 0) RETURN
27 CONTINUE
GO TO 99
C
C POWER
30 IF (M2*N2 .NE. 1) CALL ERROR(30)
IF (ERR .GT. 0) RETURN
IF (M .NE. N) CALL ERROR(20)
IF (ERR .GT. 0) RETURN
NEXP = IDINT(STKR(L2))
IF (STKR(L2) .NE. DFLOAT(NEXP)) GO TO 39
IF (STKI(L2) .NE. 0.0D0) GO TO 39
IF (NEXP .LT. 2) GO TO 39
MN = M*N
ERR = L2+MN+N - LSTK(BOT)
IF (ERR .GT. 0) CALL ERROR(17)
IF (ERR .GT. 0) RETURN
CALL WCOPY(MN,STKR(L),STKI(L),1,STKR(L2),STKI(L2),1)
L3 = L2+MN
DO 36 KEXP = 2, NEXP
DO 35 J = 1, N
LS = L+(J-1)*N
CALL WCOPY(N,STKR(LS),STKI(LS),1,STKR(L3),STKI(L3),1)
DO 34 I = 1, N
LS = L2+I-1
LL = L+I-1+(J-1)*N
STKR(LL) = WDOTUR(N,STKR(LS),STKI(LS),N,STKR(L3),STKI(L3),1)
STKI(LL) = WDOTUI(N,STKR(LS),STKI(LS),N,STKR(L3),STKI(L3),1)
34 CONTINUE
35 CONTINUE
36 CONTINUE
GO TO 99
C
C NONINTEGER OR NONPOSITIVE POWER, USE EIGENVECTORS
39 FUN = 2
FIN = 0
GO TO 99
C
C ADD OR SUBTRACT SCALAR
50 IF (M2 .NE. N2) CALL ERROR(8)
IF (ERR .GT. 0) RETURN
M = M2
N = N2
MSTK(TOP) = M
NSTK(TOP) = N
SR = STKR(L)
SI = STKI(L)
CALL WCOPY(M*N,STKR(L+1),STKI(L+1),1,STKR(L),STKI(L),1)
GO TO 58
52 IF (M .NE. N) CALL ERROR(8)
IF (ERR .GT. 0) RETURN
SR = STKR(L2)
SI = STKI(L2)
GO TO 58
54 IF (M2 .NE. N2) CALL ERROR(9)
IF (ERR .GT. 0) RETURN
M = M2
N = N2
MSTK(TOP) = M
NSTK(TOP) = N
SR = STKR(L)
SI = STKI(L)
CALL WCOPY(M*N,STKR(L+1),STKI(L+1),1,STKR(L),STKI(L),1)
CALL WRSCAL(M*N,-1.0D0,STKR(L),STKI(L),1)
GO TO 58
56 IF (M .NE. N) CALL ERROR(9)
IF (ERR .GT. 0) RETURN
SR = -STKR(L2)
SI = -STKI(L2)
GO TO 58
58 DO 59 I = 1, N
LL = L + (I-1)*(N+1)
STKR(LL) = FLOP(STKR(LL)+SR)
STKI(LL) = FLOP(STKI(LL)+SI)
59 CONTINUE
GO TO 99
C
C COLON
60 E2 = STKR(L2)
ST = 1.0D0
N = 0
IF (RHS .LT. 3) GO TO 61
ST = STKR(L)
TOP = TOP-1
L = LSTK(TOP)
IF (ST .EQ. 0.0D0) GO TO 63
61 E1 = STKR(L)
C CHECK FOR CLAUSE
IF (RSTK(PT) .EQ. 3) GO TO 64
ERR = L + MAX0(3,IDINT((E2-E1)/ST)) - LSTK(BOT)
IF (ERR .GT. 0) CALL ERROR(17)
IF (ERR .GT. 0) RETURN
62 IF (ST .GT. 0.0D0 .AND. STKR(L) .GT. E2) GO TO 63
IF (ST .LT. 0.0D0 .AND. STKR(L) .LT. E2) GO TO 63
N = N+1
L = L+1
STKR(L) = E1 + DFLOAT(N)*ST
STKI(L) = 0.0D0
GO TO 62
63 NSTK(TOP) = N
MSTK(TOP) = 1
IF (N .EQ. 0) MSTK(TOP) = 0
GO TO 99
C
C FOR CLAUSE
64 STKR(L) = E1
STKR(L+1) = ST
STKR(L+2) = E2
MSTK(TOP) = -3
NSTK(TOP) = -1
GO TO 99
C
C ELEMENTWISE OPERATIONS
70 OP = OP - DOT
IF (M.NE.M2 .OR. N.NE.N2) CALL ERROR(10)
IF (ERR .GT. 0) RETURN
MN = M*N
DO 72 I = 1, MN
J = L+I-1
K = L2+I-1
IF (OP .EQ. STAR)
$ CALL WMUL(STKR(J),STKI(J),STKR(K),STKI(K),STKR(J),STKI(J))
IF (OP .EQ. SLASH)
$ CALL WDIV(STKR(J),STKI(J),STKR(K),STKI(K),STKR(J),STKI(J))
IF (OP .EQ. BSLASH)
$ CALL WDIV(STKR(K),STKI(K),STKR(J),STKI(J),STKR(J),STKI(J))
IF (ERR .GT. 0) RETURN
72 CONTINUE
GO TO 99
C
C KRONECKER
80 FIN = OP - 2*DOT - STAR + 11
FUN = 6
TOP = TOP + 1
RHS = 2
GO TO 99
C
99 RETURN
END
SUBROUTINE STACKG(ID)
INTEGER ID(4)
C
C GET VARIABLES FROM STORAGE
C
DOUBLE PRECISION STKR(5005),STKI(5005)
INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP
INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE
INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)
COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP
COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE
COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN
LOGICAL EQID
IF (DDT .EQ. 1) WRITE(WTE,100) ID
100 FORMAT(1X,'STACKG',4I4)
CALL PUTID(IDSTK(1,BOT-1), ID)
K = LSIZE+1
10 K = K-1
IF (.NOT.EQID(IDSTK(1,K), ID)) GO TO 10
IF (K .GE. LSIZE-1 .AND. RHS .GT. 0) GO TO 98
IF (K .EQ. BOT-1) GO TO 98
LK = LSTK(K)
IF (RHS .EQ. 1) GO TO 40
IF (RHS .EQ. 2) GO TO 60
IF (RHS .GT. 2) CALL ERROR(21)
IF (ERR .GT. 0) RETURN
L = 1
IF (TOP .GT. 0) L = LSTK(TOP) + MSTK(TOP)*NSTK(TOP)
IF (TOP+1 .GE. BOT) CALL ERROR(18)
IF (ERR .GT. 0) RETURN
TOP = TOP+1
C
C LOAD VARIABLE TO TOP OF STACK
LSTK(TOP) = L
MSTK(TOP) = MSTK(K)
NSTK(TOP) = NSTK(K)
MN = MSTK(K)*NSTK(K)
ERR = L+MN - LSTK(BOT)
IF (ERR .GT. 0) CALL ERROR(17)
IF (ERR .GT. 0) RETURN
C IF RAND, MATFN6 GENERATES RANDOM NUMBER
IF (K .EQ. LSIZE) GO TO 97
CALL WCOPY(MN,STKR(LK),STKI(LK),1,STKR(L),STKI(L),1)
GO TO 99
C
C VECT(ARG)
40 IF (MSTK(TOP) .EQ. 0) GO TO 99
L = LSTK(TOP)
MN = MSTK(TOP)*NSTK(TOP)
MNK = MSTK(K)*NSTK(K)
IF (MSTK(TOP) .LT. 0) MN = MNK
DO 50 I = 1, MN
LL = L+I-1
LS = LK+I-1
IF (MSTK(TOP) .GT. 0) LS = LK + IDINT(STKR(LL)) - 1
IF (LS .LT. LK .OR. LS .GE. LK+MNK) CALL ERROR(21)
IF (ERR .GT. 0) RETURN
STKR(LL) = STKR(LS)
STKI(LL) = STKI(LS)
50 CONTINUE
MSTK(TOP) = 1
NSTK(TOP) = 1
IF (MSTK(K) .GT. 1) MSTK(TOP) = MN
IF (MSTK(K) .EQ. 1) NSTK(TOP) = MN
GO TO 99
C
C MATRIX(ARG,ARG)
60 TOP = TOP-1
L = LSTK(TOP)
IF (MSTK(TOP+1) .EQ. 0) MSTK(TOP) = 0
IF (MSTK(TOP) .EQ. 0) GO TO 99
L2 = LSTK(TOP+1)
M = MSTK(TOP)*NSTK(TOP)
IF (MSTK(TOP) .LT. 0) M = MSTK(K)
N = MSTK(TOP+1)*NSTK(TOP+1)
IF (MSTK(TOP+1) .LT. 0) N = NSTK(K)
L3 = L2 + N
MK = MSTK(K)
MNK = MSTK(K)*NSTK(K)
DO 70 J = 1, N
DO 70 I = 1, M
LI = L+I-1
IF (MSTK(TOP) .GT. 0) LI = L + IDINT(STKR(LI)) - 1
LJ = L2+J-1
IF (MSTK(TOP+1) .GT. 0) LJ = L2 + IDINT(STKR(LJ)) - 1
LS = LK + LI-L + (LJ-L2)*MK
IF (LS.LT.LK .OR. LS.GE.LK+MNK) CALL ERROR(21)
IF (ERR .GT. 0) RETURN
LL = L3 + I-1 + (J-1)*M
STKR(LL) = STKR(LS)
STKI(LL) = STKI(LS)
70 CONTINUE
MN = M*N
CALL WCOPY(MN,STKR(L3),STKI(L3),1,STKR(L),STKI(L),1)
MSTK(TOP) = M
NSTK(TOP) = N
GO TO 99
97 FIN = 7
FUN = 6
RETURN
98 FIN = 0
RETURN
99 FIN = -1
FUN = 0
RETURN
END
SUBROUTINE STACKP(ID)
INTEGER ID(4)
C
C PUT VARIABLES INTO STORAGE
C
DOUBLE PRECISION STKR(5005),STKI(5005)
INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP
INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE
INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)
COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP
COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE
COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN
LOGICAL EQID
INTEGER SEMI
DATA SEMI/39/
IF (DDT .EQ. 1) WRITE(WTE,100) ID
100 FORMAT(1X,'STACKP',4I4)
IF (TOP .LE. 0) CALL ERROR(1)
IF (ERR .GT. 0) RETURN
CALL FUNS(ID)
IF (FIN .NE. 0) CALL ERROR(25)
IF (ERR .GT. 0) RETURN
M = MSTK(TOP)
N = NSTK(TOP)
IF (M .GT. 0) L = LSTK(TOP)
IF (M .LT. 0) CALL ERROR(14)
IF (ERR .GT. 0) RETURN
IF (M .EQ. 0 .AND. N .NE. 0) GO TO 99
MN = M*N
LK = 0
MK = 1
NK = 0
LT = 0
MT = 0
NT = 0
C
C DOES VARIABLE ALREADY EXIST
CALL PUTID(IDSTK(1,BOT-1),ID)
K = LSIZE+1
05 K = K-1
IF (.NOT.EQID(IDSTK(1,K),ID)) GO TO 05
IF (K .EQ. BOT-1) GO TO 30
LK = LSTK(K)
MK = MSTK(K)
NK = NSTK(K)
MNK = MK*NK
IF (RHS .EQ. 0) GO TO 20
IF (RHS .GT. 2) CALL ERROR(15)
IF (ERR .GT. 0) RETURN
MT = MK
NT = NK
LT = L + MN
ERR = LT + MNK - LSTK(BOT)
IF (ERR .GT. 0) CALL ERROR(17)
IF (ERR .GT. 0) RETURN
CALL WCOPY(MNK,STKR(LK),STKI(LK),1,STKR(LT),STKI(LT),1)
C
C DOES IT FIT
20 IF (RHS.EQ.0 .AND. MN.EQ.MNK) GO TO 40
IF (K .GE. LSIZE-3) CALL ERROR(13)
IF (ERR .GT. 0) RETURN
C
C SHIFT STORAGE
IF (K .EQ. BOT) GO TO 25
LS = LSTK(BOT)
LL = LS + MNK
CALL WCOPY(LK-LS,STKR(LS),STKI(LS),-1,STKR(LL),STKI(LL),-1)
KM1 = K-1
DO 24 IB = BOT, KM1
I = BOT+KM1-IB
CALL PUTID(IDSTK(1,I+1),IDSTK(1,I))
MSTK(I+1) = MSTK(I)
NSTK(I+1) = NSTK(I)
LSTK(I+1) = LSTK(I)+MNK
24 CONTINUE
C
C DESTROY OLD VARIABLE
25 BOT = BOT+1
C
C CREATE NEW VARIABLE
30 IF (MN .EQ. 0) GO TO 99
IF (BOT-2 .LE. TOP) CALL ERROR(18)
IF (ERR .GT. 0) RETURN
K = BOT-1
CALL PUTID(IDSTK(1,K), ID)
IF (RHS .EQ. 1) GO TO 50
IF (RHS .EQ. 2) GO TO 55
C
C STORE
40 IF (K .LT. LSIZE) LSTK(K) = LSTK(K+1) - MN
MSTK(K) = M
NSTK(K) = N
LK = LSTK(K)
CALL WCOPY(MN,STKR(L),STKI(L),-1,STKR(LK),STKI(LK),-1)
GO TO 90
C
C VECT(ARG)
50 IF (MSTK(TOP-1) .LT. 0) GO TO 59
MN1 = 1
MN2 = 1
L1 = 0
L2 = 0
IF (N.NE.1 .OR. NK.NE.1) GO TO 52
L1 = LSTK(TOP-1)
M1 = MSTK(TOP-1)
MN1 = M1*NSTK(TOP-1)
M2 = -1
GO TO 60
52 IF (M.NE.1 .OR. MK.NE.1) CALL ERROR(15)
IF (ERR .GT. 0) RETURN
L2 = LSTK(TOP-1)
M2 = MSTK(TOP-1)
MN2 = M2*NSTK(TOP-1)
M1 = -1
GO TO 60
C
C MATRIX(ARG,ARG)
55 IF (MSTK(TOP-1).LT.0 .AND. MSTK(TOP-2).LT.0) GO TO 59
L2 = LSTK(TOP-1)
M2 = MSTK(TOP-1)
MN2 = M2*NSTK(TOP-1)
IF (M2 .LT. 0) MN2 = N
L1 = LSTK(TOP-2)
M1 = MSTK(TOP-2)
MN1 = M1*NSTK(TOP-2)
IF (M1 .LT. 0) MN1 = M
GO TO 60
C
59 IF (MN .NE. MNK) CALL ERROR(15)
IF (ERR .GT. 0) RETURN
LK = LSTK(K)
CALL WCOPY(MN,STKR(L),STKI(L),-1,STKR(LK),STKI(LK),-1)
GO TO 90
C
60 IF (MN1.NE.M .OR. MN2.NE.N) CALL ERROR(15)
IF (ERR .GT. 0) RETURN
LL = 1
IF (M1 .LT. 0) GO TO 62
DO 61 I = 1, MN1
LS = L1+I-1
MK = MAX0(MK,IDINT(STKR(LS)))
LL = MIN0(LL,IDINT(STKR(LS)))
61 CONTINUE
62 MK = MAX0(MK,M)
IF (M2 .LT. 0) GO TO 64
DO 63 I = 1, MN2
LS = L2+I-1
NK = MAX0(NK,IDINT(STKR(LS)))
LL = MIN0(LL,IDINT(STKR(LS)))
63 CONTINUE
64 NK = MAX0(NK,N)
IF (LL .LT. 1) CALL ERROR(21)
IF (ERR .GT. 0) RETURN
MNK = MK*NK
LK = LSTK(K+1) - MNK
ERR = LT + MT*NT - LK
IF (ERR .GT. 0) CALL ERROR(17)
IF (ERR .GT. 0) RETURN
LSTK(K) = LK
MSTK(K) = MK
NSTK(K) = NK
CALL WSET(MNK,0.0D0,0.0D0,STKR(LK),STKI(LK),1)
IF (NT .LT. 1) GO TO 67
DO 66 J = 1, NT
LS = LT+(J-1)*MT
LL = LK+(J-1)*MK
CALL WCOPY(MT,STKR(LS),STKI(LS),-1,STKR(LL),STKI(LL),-1)
66 CONTINUE
67 DO 68 J = 1, N
DO 68 I = 1, M
LI = L1+I-1
IF (M1 .GT. 0) LI = L1 + IDINT(STKR(LI)) - 1
LJ = L2+J-1
IF (M2 .GT. 0) LJ = L2 + IDINT(STKR(LJ)) - 1
LL = LK+LI-L1+(LJ-L2)*MK
LS = L+I-1+(J-1)*M
STKR(LL) = STKR(LS)
STKI(LL) = STKI(LS)
68 CONTINUE
GO TO 90
C
C PRINT IF DESIRED AND POP STACK
90 IF (SYM.NE.SEMI .AND. LCT(3).EQ.0) CALL PRINT(ID,K)
IF (SYM.EQ.SEMI .AND. LCT(3).EQ.1) CALL PRINT(ID,K)
IF (K .EQ. BOT-1) BOT = BOT-1
99 IF (M .NE. 0) TOP = TOP - 1 - RHS
IF (M .EQ. 0) TOP = TOP - 1
RETURN
END
SUBROUTINE TERM
DOUBLE PRECISION STKR(5005),STKI(5005)
INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP
INTEGER IDS(4,32),PSTK(32),RSTK(32),PSIZE,PT,PTZ
INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE
INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)
COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP
COMMON /RECU/ IDS,PSTK,RSTK,PSIZE,PT,PTZ
COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE
COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN
INTEGER R,OP,BSLASH,STAR,SLASH,DOT
DATA BSLASH/45/,STAR/43/,SLASH/44/,DOT/47/
IF (DDT .EQ. 1) WRITE(WTE,100) PT,RSTK(PT)
100 FORMAT(1X,'TERM ',2I4)
R = RSTK(PT)
GO TO (99,99,99,99,99,01,01,05,25,99,99,99,99,99,35,99,99,99,99),R
01 PT = PT+1
RSTK(PT) = 8
C *CALL* FACTOR
RETURN
05 PT = PT-1
10 OP = 0
IF (SYM .EQ. DOT) OP = DOT
IF (SYM .EQ. DOT) CALL GETSYM
IF (SYM.EQ.STAR .OR. SYM.EQ.SLASH .OR. SYM.EQ.BSLASH) GO TO 20
RETURN
20 OP = OP + SYM
CALL GETSYM
IF (SYM .EQ. DOT) OP = OP + SYM
IF (SYM .EQ. DOT) CALL GETSYM
PT = PT+1
PSTK(PT) = OP
RSTK(PT) = 9
C *CALL* FACTOR
RETURN
25 OP = PSTK(PT)
PT = PT-1
CALL STACK2(OP)
IF (ERR .GT. 0) RETURN
C SOME BINARY OPS DONE IN MATFNS
IF (FUN .EQ. 0) GO TO 10
PT = PT+1
RSTK(PT) = 15
C *CALL* MATFN
RETURN
35 PT = PT-1
GO TO 10
99 CALL ERROR(22)
IF (ERR .GT. 0) RETURN
RETURN
END
SUBROUTINE USER(A,M,N,S,T)
DOUBLE PRECISION A(M,N),S,T
C
INTEGER A3(9)
DATA A3 /-149,537,-27,-50,180,-9,-154,546,-25/
IF (A(1,1) .NE. 3.0D0) RETURN
DO 10 I = 1, 9
A(I,1) = DFLOAT(A3(I))
10 CONTINUE
M = 3
N = 3
RETURN
END
SUBROUTINE XCHAR(BUF,K)
INTEGER BUF(1),K
C
C SYSTEM DEPENDENT ROUTINE TO HANDLE SPECIAL CHARACTERS
C
C
INTEGER BACK,MASK
DATA BACK/Z'20202008'/,MASK/Z'000000FF'/
C
IF (BUF(1) .EQ. BACK) K = -1
L = BUF(1) .AND. MASK
IF (K .NE. -1) WRITE(6,10) BUF(1),L
10 FORMAT(1X,1H',A1,4H' = ,Z2,' hex is not a MATLAB character.')
RETURN
END
SUBROUTINE WGECO(AR,AI,LDA,N,IPVT,RCOND,ZR,ZI)
INTEGER LDA,N,IPVT(1)
DOUBLE PRECISION AR(LDA,1),AI(LDA,1),ZR(1),ZI(1)
DOUBLE PRECISION RCOND
C
C WGECO FACTORS A DOUBLE-COMPLEX MATRIX BY GAUSSIAN ELIMINATION
C AND ESTIMATES THE CONDITION OF THE MATRIX.
C
C IF RCOND IS NOT NEEDED, WGEFA IS SLIGHTLY FASTER.
C TO SOLVE A*X = B , FOLLOW WGECO BY WGESL.
C TO COMPUTE INVERSE(A)*C , FOLLOW WGECO BY WGESL.
C TO COMPUTE DETERMINANT(A) , FOLLOW WGECO BY WGEDI.
C TO COMPUTE INVERSE(A) , FOLLOW WGECO BY WGEDI.
C
C ON ENTRY
C
C A DOUBLE-COMPLEX(LDA, N)
C THE MATRIX TO BE FACTORED.
C
C LDA INTEGER
C THE LEADING DIMENSION OF THE ARRAY A .
C
C N INTEGER
C THE ORDER OF THE MATRIX A .
C
C ON RETURN
C
C A AN UPPER TRIANGULAR MATRIX AND THE MULTIPLIERS
C WHICH WERE USED TO OBTAIN IT.
C THE FACTORIZATION CAN BE WRITTEN A = L*U WHERE
C L IS A PRODUCT OF PERMUTATION AND UNIT LOWER
C TRIANGULAR MATRICES AND U IS UPPER TRIANGULAR.
C
C IPVT INTEGER(N)
C AN INTEGER VECTOR OF PIVOT INDICES.
C
C RCOND DOUBLE PRECISION
C AN ESTIMATE OF THE RECIPROCAL CONDITION OF A .
C FOR THE SYSTEM A*X = B , RELATIVE PERTURBATIONS
C IN A AND B OF SIZE EPSILON MAY CAUSE
C RELATIVE PERTURBATIONS IN X OF SIZE EPSILON/RCOND .
C IF RCOND IS SO SMALL THAT THE LOGICAL EXPRESSION
C 1.0 + RCOND .EQ. 1.0
C IS TRUE, THEN A MAY BE SINGULAR TO WORKING
C PRECISION. IN PARTICULAR, RCOND IS ZERO IF
C EXACT SINGULARITY IS DETECTED OR THE ESTIMATE
C UNDERFLOWS.
C
C Z DOUBLE-COMPLEX(N)
C A WORK VECTOR WHOSE CONTENTS ARE USUALLY UNIMPORTANT.
C IF A IS CLOSE TO A SINGULAR MATRIX, THEN Z IS
C AN APPROXIMATE NULL VECTOR IN THE SENSE THAT
C NORM(A*Z) = RCOND*NORM(A)*NORM(Z) .
C
C LINPACK. THIS VERSION DATED 07/01/79 .
C CLEVE MOLER, UNIVERSITY OF NEW MEXICO, ARGONNE NATIONAL LAB.
C
C SUBROUTINES AND FUNCTIONS
C
C LINPACK WGEFA
C BLAS WAXPY,WDOTC,WASUM
C FORTRAN DABS,DMAX1
C
C INTERNAL VARIABLES
C
DOUBLE PRECISION WDOTCR,WDOTCI,EKR,EKI,TR,TI,WKR,WKI,WKMR,WKMI
DOUBLE PRECISION ANORM,S,WASUM,SM,YNORM,FLOP
INTEGER INFO,J,K,KB,KP1,L
C
DOUBLE PRECISION ZDUMR,ZDUMI
DOUBLE PRECISION CABS1
CABS1(ZDUMR,ZDUMI) = DABS(ZDUMR) + DABS(ZDUMI)
C
C COMPUTE 1-NORM OF A
C
ANORM = 0.0D0
DO 10 J = 1, N
ANORM = DMAX1(ANORM,WASUM(N,AR(1,J),AI(1,J),1))
10 CONTINUE
C
C FACTOR
C
CALL WGEFA(AR,AI,LDA,N,IPVT,INFO)
C
C RCOND = 1/(NORM(A)*(ESTIMATE OF NORM(INVERSE(A)))) .
C ESTIMATE = NORM(Z)/NORM(Y) WHERE A*Z = Y AND CTRANS(A)*Y = E .
C CTRANS(A) IS THE CONJUGATE TRANSPOSE OF A .
C THE COMPONENTS OF E ARE CHOSEN TO CAUSE MAXIMUM LOCAL
C GROWTH IN THE ELEMENTS OF W WHERE CTRANS(U)*W = E .
C THE VECTORS ARE FREQUENTLY RESCALED TO AVOID OVERFLOW.
C
C SOLVE CTRANS(U)*W = E
C
EKR = 1.0D0
EKI = 0.0D0
DO 20 J = 1, N
ZR(J) = 0.0D0
ZI(J) = 0.0D0
20 CONTINUE
DO 110 K = 1, N
CALL WSIGN(EKR,EKI,-ZR(K),-ZI(K),EKR,EKI)
IF (CABS1(EKR-ZR(K),EKI-ZI(K))
* .LE. CABS1(AR(K,K),AI(K,K))) GO TO 40
S = CABS1(AR(K,K),AI(K,K))
* /CABS1(EKR-ZR(K),EKI-ZI(K))
CALL WRSCAL(N,S,ZR,ZI,1)
EKR = S*EKR
EKI = S*EKI
40 CONTINUE
WKR = EKR - ZR(K)
WKI = EKI - ZI(K)
WKMR = -EKR - ZR(K)
WKMI = -EKI - ZI(K)
S = CABS1(WKR,WKI)
SM = CABS1(WKMR,WKMI)
IF (CABS1(AR(K,K),AI(K,K)) .EQ. 0.0D0) GO TO 50
CALL WDIV(WKR,WKI,AR(K,K),-AI(K,K),WKR,WKI)
CALL WDIV(WKMR,WKMI,AR(K,K),-AI(K,K),WKMR,WKMI)
GO TO 60
50 CONTINUE
WKR = 1.0D0
WKI = 0.0D0
WKMR = 1.0D0
WKMI = 0.0D0
60 CONTINUE
KP1 = K + 1
IF (KP1 .GT. N) GO TO 100
DO 70 J = KP1, N
CALL WMUL(WKMR,WKMI,AR(K,J),-AI(K,J),TR,TI)
SM = FLOP(SM + CABS1(ZR(J)+TR,ZI(J)+TI))
CALL WAXPY(1,WKR,WKI,AR(K,J),-AI(K,J),1,
$ ZR(J),ZI(J),1)
S = FLOP(S + CABS1(ZR(J),ZI(J)))
70 CONTINUE
IF (S .GE. SM) GO TO 90
TR = WKMR - WKR
TI = WKMI - WKI
WKR = WKMR
WKI = WKMI
DO 80 J = KP1, N
CALL WAXPY(1,TR,TI,AR(K,J),-AI(K,J),1,
$ ZR(J),ZI(J),1)
80 CONTINUE
90 CONTINUE
100 CONTINUE
ZR(K) = WKR
ZI(K) = WKI
110 CONTINUE
S = 1.0D0/WASUM(N,ZR,ZI,1)
CALL WRSCAL(N,S,ZR,ZI,1)
C
C SOLVE CTRANS(L)*Y = W
C
DO 140 KB = 1, N
K = N + 1 - KB
IF (K .GE. N) GO TO 120
ZR(K) = ZR(K)
* + WDOTCR(N-K,AR(K+1,K),AI(K+1,K),1,ZR(K+1),ZI(K+1),1)
ZI(K) = ZI(K)
* + WDOTCI(N-K,AR(K+1,K),AI(K+1,K),1,ZR(K+1),ZI(K+1),1)
120 CONTINUE
IF (CABS1(ZR(K),ZI(K)) .LE. 1.0D0) GO TO 130
S = 1.0D0/CABS1(ZR(K),ZI(K))
CALL WRSCAL(N,S,ZR,ZI,1)
130 CONTINUE
L = IPVT(K)
TR = ZR(L)
TI = ZI(L)
ZR(L) = ZR(K)
ZI(L) = ZI(K)
ZR(K) = TR
ZI(K) = TI
140 CONTINUE
S = 1.0D0/WASUM(N,ZR,ZI,1)
CALL WRSCAL(N,S,ZR,ZI,1)
C
YNORM = 1.0D0
C
C SOLVE L*V = Y
C
DO 160 K = 1, N
L = IPVT(K)
TR = ZR(L)
TI = ZI(L)
ZR(L) = ZR(K)
ZI(L) = ZI(K)
ZR(K) = TR
ZI(K) = TI
IF (K .LT. N)
* CALL WAXPY(N-K,TR,TI,AR(K+1,K),AI(K+1,K),1,ZR(K+1),ZI(K+1),
* 1)
IF (CABS1(ZR(K),ZI(K)) .LE. 1.0D0) GO TO 150
S = 1.0D0/CABS1(ZR(K),ZI(K))
CALL WRSCAL(N,S,ZR,ZI,1)
YNORM = S*YNORM
150 CONTINUE
160 CONTINUE
S = 1.0D0/WASUM(N,ZR,ZI,1)
CALL WRSCAL(N,S,ZR,ZI,1)
YNORM = S*YNORM
C
C SOLVE U*Z = V
C
DO 200 KB = 1, N
K = N + 1 - KB
IF (CABS1(ZR(K),ZI(K))
* .LE. CABS1(AR(K,K),AI(K,K))) GO TO 170
S = CABS1(AR(K,K),AI(K,K))
* /CABS1(ZR(K),ZI(K))
CALL WRSCAL(N,S,ZR,ZI,1)
YNORM = S*YNORM
170 CONTINUE
IF (CABS1(AR(K,K),AI(K,K)) .EQ. 0.0D0) GO TO 180
CALL WDIV(ZR(K),ZI(K),AR(K,K),AI(K,K),ZR(K),ZI(K))
180 CONTINUE
IF (CABS1(AR(K,K),AI(K,K)) .NE. 0.0D0) GO TO 190
ZR(K) = 1.0D0
ZI(K) = 0.0D0
190 CONTINUE
TR = -ZR(K)
TI = -ZI(K)
CALL WAXPY(K-1,TR,TI,AR(1,K),AI(1,K),1,ZR(1),ZI(1),1)
200 CONTINUE
C MAKE ZNORM = 1.0
S = 1.0D0/WASUM(N,ZR,ZI,1)
CALL WRSCAL(N,S,ZR,ZI,1)
YNORM = S*YNORM
C
IF (ANORM .NE. 0.0D0) RCOND = YNORM/ANORM
IF (ANORM .EQ. 0.0D0) RCOND = 0.0D0
RETURN
END
SUBROUTINE WGEFA(AR,AI,LDA,N,IPVT,INFO)
INTEGER LDA,N,IPVT(1),INFO
DOUBLE PRECISION AR(LDA,1),AI(LDA,1)
C
C WGEFA FACTORS A DOUBLE-COMPLEX MATRIX BY GAUSSIAN ELIMINATION.
C
C WGEFA IS USUALLY CALLED BY WGECO, BUT IT CAN BE CALLED
C DIRECTLY WITH A SAVING IN TIME IF RCOND IS NOT NEEDED.
C (TIME FOR WGECO) = (1 + 9/N)*(TIME FOR WGEFA) .
C
C ON ENTRY
C
C A DOUBLE-COMPLEX(LDA, N)
C THE MATRIX TO BE FACTORED.
C
C LDA INTEGER
C THE LEADING DIMENSION OF THE ARRAY A .
C
C N INTEGER
C THE ORDER OF THE MATRIX A .
C
C ON RETURN
C
C A AN UPPER TRIANGULAR MATRIX AND THE MULTIPLIERS
C WHICH WERE USED TO OBTAIN IT.
C THE FACTORIZATION CAN BE WRITTEN A = L*U WHERE
C L IS A PRODUCT OF PERMUTATION AND UNIT LOWER
C TRIANGULAR MATRICES AND U IS UPPER TRIANGULAR.
C
C IPVT INTEGER(N)
C AN INTEGER VECTOR OF PIVOT INDICES.
C
C INFO INTEGER
C = 0 NORMAL VALUE.
C = K IF U(K,K) .EQ. 0.0 . THIS IS NOT AN ERROR
C CONDITION FOR THIS SUBROUTINE, BUT IT DOES
C INDICATE THAT WGESL OR WGEDI WILL DIVIDE BY ZERO
C IF CALLED. USE RCOND IN WGECO FOR A RELIABLE
C INDICATION OF SINGULARITY.
C
C LINPACK. THIS VERSION DATED 07/01/79 .
C CLEVE MOLER, UNIVERSITY OF NEW MEXICO, ARGONNE NATIONAL LAB.
C
C SUBROUTINES AND FUNCTIONS
C
C BLAS WAXPY,WSCAL,IWAMAX
C FORTRAN DABS
C
C INTERNAL VARIABLES
C
DOUBLE PRECISION TR,TI
INTEGER IWAMAX,J,K,KP1,L,NM1
C
DOUBLE PRECISION ZDUMR,ZDUMI
DOUBLE PRECISION CABS1
CABS1(ZDUMR,ZDUMI) = DABS(ZDUMR) + DABS(ZDUMI)
C
C GAUSSIAN ELIMINATION WITH PARTIAL PIVOTING
C
INFO = 0
NM1 = N - 1
IF (NM1 .LT. 1) GO TO 70
DO 60 K = 1, NM1
KP1 = K + 1
C
C FIND L = PIVOT INDEX
C
L = IWAMAX(N-K+1,AR(K,K),AI(K,K),1) + K - 1
IPVT(K) = L
C
C ZERO PIVOT IMPLIES THIS COLUMN ALREADY TRIANGULARIZED
C
IF (CABS1(AR(L,K),AI(L,K)) .EQ. 0.0D0) GO TO 40
C
C INTERCHANGE IF NECESSARY
C
IF (L .EQ. K) GO TO 10
TR = AR(L,K)
TI = AI(L,K)
AR(L,K) = AR(K,K)
AI(L,K) = AI(K,K)
AR(K,K) = TR
AI(K,K) = TI
10 CONTINUE
C
C COMPUTE MULTIPLIERS
C
CALL WDIV(-1.0D0,0.0D0,AR(K,K),AI(K,K),TR,TI)
CALL WSCAL(N-K,TR,TI,AR(K+1,K),AI(K+1,K),1)
C
C ROW ELIMINATION WITH COLUMN INDEXING
C
DO 30 J = KP1, N
TR = AR(L,J)
TI = AI(L,J)
IF (L .EQ. K) GO TO 20
AR(L,J) = AR(K,J)
AI(L,J) = AI(K,J)
AR(K,J) = TR
AI(K,J) = TI
20 CONTINUE
CALL WAXPY(N-K,TR,TI,AR(K+1,K),AI(K+1,K),1,AR(K+1,J),
* AI(K+1,J),1)
30 CONTINUE
GO TO 50
40 CONTINUE
INFO = K
50 CONTINUE
60 CONTINUE
70 CONTINUE
IPVT(N) = N
IF (CABS1(AR(N,N),AI(N,N)) .EQ. 0.0D0) INFO = N
RETURN
END
SUBROUTINE WGESL(AR,AI,LDA,N,IPVT,BR,BI,JOB)
INTEGER LDA,N,IPVT(1),JOB
DOUBLE PRECISION AR(LDA,1),AI(LDA,1),BR(1),BI(1)
C
C WGESL SOLVES THE DOUBLE-COMPLEX SYSTEM
C A * X = B OR CTRANS(A) * X = B
C USING THE FACTORS COMPUTED BY WGECO OR WGEFA.
C
C ON ENTRY
C
C A DOUBLE-COMPLEX(LDA, N)
C THE OUTPUT FROM WGECO OR WGEFA.
C
C LDA INTEGER
C THE LEADING DIMENSION OF THE ARRAY A .
C
C N INTEGER
C THE ORDER OF THE MATRIX A .
C
C IPVT INTEGER(N)
C THE PIVOT VECTOR FROM WGECO OR WGEFA.
C
C B DOUBLE-COMPLEX(N)
C THE RIGHT HAND SIDE VECTOR.
C
C JOB INTEGER
C = 0 TO SOLVE A*X = B ,
C = NONZERO TO SOLVE CTRANS(A)*X = B WHERE
C CTRANS(A) IS THE CONJUGATE TRANSPOSE.
C
C ON RETURN
C
C B THE SOLUTION VECTOR X .
C
C ERROR CONDITION
C
C A DIVISION BY ZERO WILL OCCUR IF THE INPUT FACTOR CONTAINS A
C ZERO ON THE DIAGONAL. TECHNICALLY THIS INDICATES SINGULARITY
C BUT IT IS OFTEN CAUSED BY IMPROPER ARGUMENTS OR IMPROPER
C SETTING OF LDA . IT WILL NOT OCCUR IF THE SUBROUTINES ARE
C CALLED CORRECTLY AND IF WGECO HAS SET RCOND .GT. 0.0
C OR WGEFA HAS SET INFO .EQ. 0 .
C
C TO COMPUTE INVERSE(A) * C WHERE C IS A MATRIX
C WITH P COLUMNS
C CALL WGECO(A,LDA,N,IPVT,RCOND,Z)
C IF (RCOND IS TOO SMALL) GO TO ...
C DO 10 J = 1, P
C CALL WGESL(A,LDA,N,IPVT,C(1,J),0)
C 10 CONTINUE
C
C LINPACK. THIS VERSION DATED 07/01/79 .
C CLEVE MOLER, UNIVERSITY OF NEW MEXICO, ARGONNE NATIONAL LAB.
C
C SUBROUTINES AND FUNCTIONS
C
C BLAS WAXPY,WDOTC
C
C INTERNAL VARIABLES
C
DOUBLE PRECISION WDOTCR,WDOTCI,TR,TI
INTEGER K,KB,L,NM1
C
NM1 = N - 1
IF (JOB .NE. 0) GO TO 50
C
C JOB = 0 , SOLVE A * X = B
C FIRST SOLVE L*Y = B
C
IF (NM1 .LT. 1) GO TO 30
DO 20 K = 1, NM1
L = IPVT(K)
TR = BR(L)
TI = BI(L)
IF (L .EQ. K) GO TO 10
BR(L) = BR(K)
BI(L) = BI(K)
BR(K) = TR
BI(K) = TI
10 CONTINUE
CALL WAXPY(N-K,TR,TI,AR(K+1,K),AI(K+1,K),1,BR(K+1),BI(K+1),
* 1)
20 CONTINUE
30 CONTINUE
C
C NOW SOLVE U*X = Y
C
DO 40 KB = 1, N
K = N + 1 - KB
CALL WDIV(BR(K),BI(K),AR(K,K),AI(K,K),BR(K),BI(K))
TR = -BR(K)
TI = -BI(K)
CALL WAXPY(K-1,TR,TI,AR(1,K),AI(1,K),1,BR(1),BI(1),1)
40 CONTINUE
GO TO 100
50 CONTINUE
C
C JOB = NONZERO, SOLVE CTRANS(A) * X = B
C FIRST SOLVE CTRANS(U)*Y = B
C
DO 60 K = 1, N
TR = BR(K) - WDOTCR(K-1,AR(1,K),AI(1,K),1,BR(1),BI(1),1)
TI = BI(K) - WDOTCI(K-1,AR(1,K),AI(1,K),1,BR(1),BI(1),1)
CALL WDIV(TR,TI,AR(K,K),-AI(K,K),BR(K),BI(K))
60 CONTINUE
C
C NOW SOLVE CTRANS(L)*X = Y
C
IF (NM1 .LT. 1) GO TO 90
DO 80 KB = 1, NM1
K = N - KB
BR(K) = BR(K)
* + WDOTCR(N-K,AR(K+1,K),AI(K+1,K),1,BR(K+1),BI(K+1),1)
BI(K) = BI(K)
* + WDOTCI(N-K,AR(K+1,K),AI(K+1,K),1,BR(K+1),BI(K+1),1)
L = IPVT(K)
IF (L .EQ. K) GO TO 70
TR = BR(L)
TI = BI(L)
BR(L) = BR(K)
BI(L) = BI(K)
BR(K) = TR
BI(K) = TI
70 CONTINUE
80 CONTINUE
90 CONTINUE
100 CONTINUE
RETURN
END
SUBROUTINE WGEDI(AR,AI,LDA,N,IPVT,DETR,DETI,WORKR,WORKI,JOB)
INTEGER LDA,N,IPVT(1),JOB
DOUBLE PRECISION AR(LDA,1),AI(LDA,1),DETR(2),DETI(2),WORKR(1),
* WORKI(1)
C
C WGEDI COMPUTES THE DETERMINANT AND INVERSE OF A MATRIX
C USING THE FACTORS COMPUTED BY WGECO OR WGEFA.
C
C ON ENTRY
C
C A DOUBLE-COMPLEX(LDA, N)
C THE OUTPUT FROM WGECO OR WGEFA.
C
C LDA INTEGER
C THE LEADING DIMENSION OF THE ARRAY A .
C
C N INTEGER
C THE ORDER OF THE MATRIX A .
C
C IPVT INTEGER(N)
C THE PIVOT VECTOR FROM WGECO OR WGEFA.
C
C WORK DOUBLE-COMPLEX(N)
C WORK VECTOR. CONTENTS DESTROYED.
C
C JOB INTEGER
C = 11 BOTH DETERMINANT AND INVERSE.
C = 01 INVERSE ONLY.
C = 10 DETERMINANT ONLY.
C
C ON RETURN
C
C A INVERSE OF ORIGINAL MATRIX IF REQUESTED.
C OTHERWISE UNCHANGED.
C
C DET DOUBLE-COMPLEX(2)
C DETERMINANT OF ORIGINAL MATRIX IF REQUESTED.
C OTHERWISE NOT REFERENCED.
C DETERMINANT = DET(1) * 10.0**DET(2)
C WITH 1.0 .LE. CABS1(DET(1) .LT. 10.0
C OR DET(1) .EQ. 0.0 .
C
C ERROR CONDITION
C
C A DIVISION BY ZERO WILL OCCUR IF THE INPUT FACTOR CONTAINS
C A ZERO ON THE DIAGONAL AND THE INVERSE IS REQUESTED.
C IT WILL NOT OCCUR IF THE SUBROUTINES ARE CALLED CORRECTLY
C AND IF WGECO HAS SET RCOND .GT. 0.0 OR WGEFA HAS SET
C INFO .EQ. 0 .
C
C LINPACK. THIS VERSION DATED 07/01/79 .
C CLEVE MOLER, UNIVERSITY OF NEW MEXICO, ARGONNE NATIONAL LAB.
C
C SUBROUTINES AND FUNCTIONS
C
C BLAS WAXPY,WSCAL,WSWAP
C FORTRAN DABS,MOD
C
C INTERNAL VARIABLES
C
DOUBLE PRECISION TR,TI
DOUBLE PRECISION TEN
INTEGER I,J,K,KB,KP1,L,NM1
C
DOUBLE PRECISION ZDUMR,ZDUMI
DOUBLE PRECISION CABS1
CABS1(ZDUMR,ZDUMI) = DABS(ZDUMR) + DABS(ZDUMI)
C
C COMPUTE DETERMINANT
C
IF (JOB/10 .EQ. 0) GO TO 80
DETR(1) = 1.0D0
DETI(1) = 0.0D0
DETR(2) = 0.0D0
DETI(2) = 0.0D0
TEN = 10.0D0
DO 60 I = 1, N
IF (IPVT(I) .EQ. I) GO TO 10
DETR(1) = -DETR(1)
DETI(1) = -DETI(1)
10 CONTINUE
CALL WMUL(AR(I,I),AI(I,I),DETR(1),DETI(1),DETR(1),DETI(1))
C ...EXIT
C ...EXIT
IF (CABS1(DETR(1),DETI(1)) .EQ. 0.0D0) GO TO 70
20 IF (CABS1(DETR(1),DETI(1)) .GE. 1.0D0) GO TO 30
DETR(1) = TEN*DETR(1)
DETI(1) = TEN*DETI(1)
DETR(2) = DETR(2) - 1.0D0
DETI(2) = DETI(2) - 0.0D0
GO TO 20
30 CONTINUE
40 IF (CABS1(DETR(1),DETI(1)) .LT. TEN) GO TO 50
DETR(1) = DETR(1)/TEN
DETI(1) = DETI(1)/TEN
DETR(2) = DETR(2) + 1.0D0
DETI(2) = DETI(2) + 0.0D0
GO TO 40
50 CONTINUE
60 CONTINUE
70 CONTINUE
80 CONTINUE
C
C COMPUTE INVERSE(U)
C
IF (MOD(JOB,10) .EQ. 0) GO TO 160
DO 110 K = 1, N
CALL WDIV(1.0D0,0.0D0,AR(K,K),AI(K,K),AR(K,K),AI(K,K))
TR = -AR(K,K)
TI = -AI(K,K)
CALL WSCAL(K-1,TR,TI,AR(1,K),AI(1,K),1)
KP1 = K + 1
SHAR_EOF
# End of shell archive
exit 0
--
Bob Page, U of Lowell CS Dept. page@swan.ulowell.edu ulowell!page
Have five nice days.